home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / SourceCode / GameKit / Examples / NX_Invaders / NXIAlien.m < prev    next >
Text File  |  1995-06-12  |  2KB  |  89 lines

  1.  
  2. #import "NXIAlien.h"
  3. #import "NXIAlienOverseer.h"
  4.  
  5. static int seriesFrames[3] = { ALIEN_FRAMES, ALIEN_FRAMES, ALIEN_FRAMES};
  6.  
  7. @implementation NXIAlien
  8.  
  9. - init
  10. {
  11.     NXPoint zeroPoint = { 0.0, 0.0 };
  12.     return [self initAlienColor:0 at:&zeroPoint];
  13. }
  14.  
  15. - initAlienColor:(int)col at:(NXPoint *)startPos 
  16. {
  17.     id ret = [super init];
  18.     overseer = [NXIAlienOverseer new];    // find the overseer object
  19.     NX_HEIGHT(&boundingBox) = ALIEN_WIDTH;
  20.     NX_WIDTH(&boundingBox) = ALIEN_HEIGHT;
  21.     renderedImage = [NXImage findImageNamed:"Invaders.tiff"];
  22.     state = ALIEN_ALIVE;
  23.     [self setMaxFrames:seriesFrames count:3];
  24.     return ret;
  25. }
  26.  
  27. - setStage:aStage
  28. {
  29.     id ret = [super setStage:aStage];
  30.     NXRect bounds;
  31.     [[aStage bufferType:GK_SCREEN_BUFFER] getBounds:&bounds];
  32.     screenWidth = NX_WIDTH(&bounds);
  33.     return ret;
  34. }
  35.  
  36. - move:sender        // move one frame
  37. {    // we let the overseer handle moving all the invaders since they all
  38.     // move in concert.
  39.     NXPoint whichWay;
  40.     // find out where to go:
  41.     [overseer movementVector:&whichWay];
  42.     // move that direction:
  43.     GK_ADD_VECTORS(&nextLocation, &whichWay);
  44.     if (GK_NONZERO_VECTOR(&whichWay)) movedThisFrame = YES;
  45.     else movedThisFrame = NO;
  46.     return self;
  47. }
  48.  
  49. - (BOOL)hitEdge:(int)anEdge
  50. {
  51.     if ((anEdge == LEFT_EDGE) &&
  52.         (GK_location.x < 2 * ALIEN_HORIZONTAL_STEP_SIZE)) return YES;
  53.     if ((anEdge == RIGHT_EDGE) && (GK_location.x >
  54.         screenWidth - 2 * ALIEN_HORIZONTAL_STEP_SIZE)) return YES;
  55.     return NO;
  56. }
  57.  
  58. - leaveTheStage    // get the actor off the stage and into the "free" list
  59. {
  60.     [overseer alienLeavingTheStage:self];
  61.     // ***** play a dead sound here?  or upon collision in the method below?
  62.     return [super leaveTheStage];
  63. }
  64.  
  65. - collidedWith:anActor    // called when it is detected that we hit something
  66. {    // we need to see if it was a player's bullet that hit us (we ignore
  67.     // anything else...) and then act accordingly.
  68.     // *****
  69.     return self;
  70. }
  71.  
  72. - updateDrawingState    // change the internal state machine (ie. advance
  73. {
  74.     id ret;
  75.     if ((state == ALIEN_ALIVE) && !movedThisFrame) return self;
  76.     ret = [super updateDrawingState];
  77.     // wrap frames early for living invader (there are only two frames)
  78.     if ((state == ALIEN_ALIVE) && (frame >= ALIEN_WALK_FRAMES)) frame = 0;
  79.     // if we've finished stepping through the death frames, then we need
  80.     // to get off the stage since the death is complete.
  81.     if ((state == ALIEN_DYING) && !frame) { // wraparound occurred
  82.         state = ALIEN_DEAD;
  83.         [self leaveTheStage];
  84.     }
  85.     return ret;
  86. }
  87.  
  88. @end
  89.